/*
 * @Author: hrg
 * @Date: 2024-01-29 17:03:28
 * @LastEditTime: 2024-01-30 09:06:26
 * @FilePath: \study_go\study08_gin\gin_demo_07\main\main.go
 * @Description:同步与异步处理
 */
package main

import (
	"log"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.New()

	// 异步
	r.GET("/long_async", longAsync)

	// 同步
	r.GET("/long_sync", longSync)

	r.Run(":9090")
}

// 异步是基于goroutine机制实现的，并且启动新的goroutine时，不应该使用原始上下文，必须使用它的副本
// 异步
func longAsync(c *gin.Context) {
	// 拷贝一个副本
	copyContext := c.Copy()
	// 异步处理
	// 通过go关键字来启动一个新的goroutine，用于执行指定的函数或方法
	go func() {
		time.Sleep(3 * time.Second)
		log.Println("异步执行：" + copyContext.Request.URL.Path)
	}()
	// 立即返回响应，不阻塞主线程
	c.JSON(http.StatusOK, gin.H{
		"message": "已经启动异步处理",
	})
}

// 同步
func longSync(c *gin.Context) {
	time.Sleep(3 * time.Second)
	log.Println("同步执行：" + c.Request.URL.Path)
	c.JSON(200, gin.H{
		"hja": "sadf",
	})
}
